home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2posx10.zoo / m2posix.10 / src / file.dpp < prev    next >
Encoding:
Modula Definition  |  1993-12-23  |  35.4 KB  |  685 lines

  1. DEFINITION MODULE file;
  2. __DEF_SWITCHES__
  3. #ifdef HM2
  4. #ifdef __LONG_WHOLE__
  5. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  6. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  7. #else
  8. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  9. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  10. #endif
  11. #endif
  12. (*****************************************************************************)
  13. (* Funktionen, die ``normale'' Dateien bearbeiten.                           *)
  14. (*                                                                           *)
  15. (* Ein Fehler ist immer dann aufgetreten, wenn bei Funktionen mit Typ INTEGER*)
  16. (* ein negativer Wert zurueckgegeben wird.                                   *)
  17. (* Die genaue Fehlerursache kann bei Bedarf ueber "err.errno" und die ent-   *)
  18. (* sprechenden Konstanten ermittelt werden. Die Funktionen veraendern "errno"*)
  19. (* nur dann, wenn ein Fehler aufgetreten ist, bei erfolgreicher Ausfuehrung  *)
  20. (* wird "errno" nicht veraendert.                                            *)
  21. (*                                                                           *)
  22. (* GEMDOS:                                                                   *)
  23. (* Die Eigenschaften der Funktionen unter dem ``blanken'' GEMDOS sind z.T.   *)
  24. (* stark eingeschraenkt; unter dem Stichwort GEMDOS ist deswegen immer       *)
  25. (* angegeben, in wieweit die Funktion emuliert werden kann. Ist MiNT-Unter-  *)
  26. (* stuetzung angegeben, so ist unter der Betriebssystemerweiterung MiNT      *)
  27. (* eine bessere Unterstuetzung der Funktionen zu erwarten; wie weit diese    *)
  28. (* geht, ist unter dem Stichwort MiNT angegeben.                             *)
  29. (* --------------------------------------------------------------------------*)
  30. (* 05-Dez-93, Holger Kleinschmidt                                            *)
  31. (*****************************************************************************)
  32.  
  33. FROM SYSTEM IMPORT
  34. (* TYPE *) ADDRESS;
  35.  
  36. FROM types IMPORT
  37. (* TYPE *) uidT, gidT, inoT, timeT, offT, sizeT, ssizeT, devT, nlinkT, pidT;
  38.  
  39. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  40.  
  41. (*======= "stat()", "open()", "creat()", "umask()", "chmod()" ===============*)
  42.  
  43. TYPE
  44. #if reverse_set
  45.   FileModes = (
  46.     Type15,   (* = 100000B *)
  47.     Type14,   (* = 040000B *)
  48.     Type13,   (* = 020000B *)
  49.     Type12,   (* = 010000B *)
  50.  
  51.     sISUID,   (* = 004000B, effektive Benutzer-ID bei Ausfuehrung setzen *)
  52.     sISGID,   (* = 002000B, effektive Gruppen-ID bei Ausfuehrung setzen *)
  53.     sISVTX,   (* = 001000B  reserviert, nicht POSIX *)
  54.  
  55.     sIRUSR,   (* = 000400B, Besitzer: Leseberechtigung *)
  56.     sIWUSR,   (* = 000200B, Besitzer: Schreibberechtigung *)
  57.     sIXUSR,   (* = 000100B, Besitzer: Ausfuehr/Suchberechtigung *)
  58.     sIRGRP,   (* = 000040B, Gruppe  : Leseberechtigung *)
  59.     sIWGRP,   (* = 000020B, Gruppe  : Schreibberechtigung *)
  60.     sIXGRP,   (* = 000010B, Gruppe  : Ausfuehr/Suchberechtigung *)
  61.     sIROTH,   (* = 000004B, Andere  : Leseberechtigung *)
  62.     sIWOTH,   (* = 000002B, Andere  : Schreibberechtigung *)
  63.     sIXOTH    (* = 000001B, Andere  : Ausfuehr/Suchberechtigung *)
  64.   );
  65. #else
  66.   FileModes = (
  67.     sIXOTH,   (* = 000001B, Andere  : Ausfuehr/Suchberechtigung *)
  68.     sIWOTH,   (* = 000002B, Andere  : Schreibberechtigung *)
  69.     sIROTH,   (* = 000004B, Andere  : Leseberechtigung *)
  70.     sIXGRP,   (* = 000010B, Gruppe  : Ausfuehr/Suchberechtigung *)
  71.     sIWGRP,   (* = 000020B, Gruppe  : Schreibberechtigung *)
  72.     sIRGRP,   (* = 000040B, Gruppe  : Leseberechtigung *)
  73.     sIXUSR,   (* = 000100B, Besitzer: Ausfuehr/Suchberechtigung *)
  74.     sIWUSR,   (* = 000200B, Besitzer: Schreibberechtigung *)
  75.     sIRUSR,   (* = 000400B, Besitzer: Leseberechtigung *)
  76.  
  77.     sISVTX,   (* = 001000B  reserviert, nicht POSIX *)
  78.     sISGID,   (* = 002000B, effektive Gruppen-ID bei Ausfuehrung setzen *)
  79.     sISUID,   (* = 004000B, effektive Benutzer-ID bei Ausfuehrung setzen *)
  80.  
  81.     Type12,   (* = 010000B *)
  82.     Type13,   (* = 020000B *)
  83.     Type14,   (* = 040000B *)
  84.     Type15    (* = 100000B *)
  85.   );
  86. #endif
  87.   modeT = PACKEDSET OF FileModes;
  88.  
  89.  
  90. CONST
  91.   sIRWXU = modeT{sIRUSR, sIWUSR, sIXUSR};
  92.   sIRWXG = modeT{sIRGRP, sIWGRP, sIXGRP};
  93.   sIRWXO = modeT{sIROTH, sIWOTH, sIXOTH};
  94.  
  95. (* Die folgenden Konstanten sind nicht POSIX: *)
  96. CONST
  97. #if reverse_set
  98.   sIFMT  = modeT{Type15..Type12};         (* 170000B, Maske fuer Dateityp *)
  99. #else
  100.   sIFMT  = modeT{Type12..Type15};         (* 170000B, Maske fuer Dateityp *)
  101. #endif
  102.   sIFCHR = modeT{Type13};                 (* 020000B, zeichenor. Geraet *)
  103.   sIFDIR = modeT{Type14};                 (* 040000B, Verzeichnis *)
  104.   sIFBLK = modeT{Type13, Type14};         (* 060000B, blockor. Geraet *)
  105.   sIFREG = modeT{Type15};                 (* 100000B, normale Datei *)
  106.   sIFIFO = modeT{Type13, Type15};         (* 120000B, Pipe *)
  107.   sIFLNK = modeT{Type13, Type14, Type15}; (* 160000B, symb. Link, *)
  108.  
  109. (* IF st.stMode * sIFMT = sIFCHR THEN
  110.  *           ...
  111.  *)
  112.  
  113.  
  114. TYPE
  115.   StatRec = RECORD
  116.     stMode  : modeT;    (* Dateityp & Zugriffsberechtigung *)
  117.     stIno   : inoT;     (* INODE, zus. mit 'stDev' eindeutiger Index *)
  118.     stDev   : devT;     (* zustaendiges Geraet *)
  119.     stNlink : nlinkT;   (* Anzahl der Links *)
  120.     stUid   : uidT;     (* Benutzerkennung des Besitzers *)
  121.     stGid   : gidT;     (* Gruppenkennung des Besitzers *)
  122.     stSize  : offT;     (* Dateilaenge in Bytes *)
  123.     stAtime : timeT;    (* Datum/Zeit des letzten Dateizugriffs *)
  124.     stMtime : timeT;    (* Datum/Zeit der letzten Dateiveraenderung *)
  125.     stCtime : timeT;    (* Datum/Zeit der letzten INODE-Aenderung *)
  126.     (* Weitere Elemente, wie z.B. 'stBlksize', sind nicht standardisiert *)
  127.   END;
  128.  
  129. (*======================= "access()" ========================================*)
  130.  
  131. TYPE
  132. #if reverse_set
  133.   AccessModes = (
  134.     Access15,Access14,Access13,Access12,Access11, (* --> keine 8-Bit-Menge *)
  135.     Access10,Access9, Access8, Access7,
  136.     Access6, Access5, Access4, Access3,
  137.     rOK,        (* = 0004H, Leseberechtigung *)
  138.     wOK,        (* = 0002H, Schreibberechtigung *)
  139.     xOK         (* = 0001H, Ausfuehr/Suchberechtigung *)
  140.   );
  141. #else
  142.   AccessModes = (
  143.     xOK,        (* = 0001H, Ausfuehr/Suchberechtigung *)
  144.     wOK,        (* = 0002H, Schreibberechtigung *)
  145.     rOK,        (* = 0004H, Leseberechtigung *)
  146.     Access3, Access4, Access5, Access6,
  147.     Access7, Access8, Access9, Access10,
  148.     Access11,Access12,Access13,Access14,Access15  (* --> keine 8-Bit-Menge *)
  149.   );
  150. #endif
  151.  
  152.   AccessMode = PACKEDSET OF AccessModes;
  153.  
  154. CONST
  155.   fOK = AccessMode{}; (* = 0000H, Existenz *)
  156.  
  157.  
  158. (*======================= "utime()" =========================================*)
  159.  
  160. TYPE
  161.   UTimeBuf = RECORD
  162.     actime  : timeT;
  163.     modtime : timeT;
  164.   END;
  165.  
  166. (*======================= "open()" ==========================================*)
  167.  
  168. TYPE
  169. #if reverse_set
  170.   OpenModes = (
  171.     Open15, Open14, Open13,
  172.     oNOCTTY,    (* Falls die zu oeffnende Datei ein (Pseudo)Terminal ist,
  173.                    wird es nicht zum Kontroll-Terminal, wenn der Prozess
  174.                    im Moment kein Kontrollterminal hat. *)
  175.     oEXCL,      (* Neu Anlegen nicht erlaubt, falls schon vorhanden *)
  176.     oTRUNC,     (* Vorhandene Datei auf Laenge 0 kuerzen *)
  177.     oCREAT,     (* Datei anlegen, falls nicht vorhanden *)
  178.     oNONBLOCK,  (* Nicht blockieren beim Lesen/Schreiben/Oeffnen *)
  179.     Open7, Open6, Open5, Open4,
  180.     oAPPEND,    (* Schreiben immer ans Ende des Files *)
  181.     Open2,
  182.     rw1,
  183.     rw0
  184.   );
  185. #else
  186.   OpenModes = (
  187.     rw0,
  188.     rw1,
  189.     Open2,
  190.     oAPPEND,    (* Schreiben immer ans Ende des Files *)
  191.     Open4, Open5, Open6, Open7,
  192.     oNONBLOCK,  (* Nicht blockieren beim Lesen/Schreiben/Oeffnen *)
  193.     oCREAT,     (* Datei anlegen, falls nicht vorhanden *)
  194.     oTRUNC,     (* Vorhandene Datei auf Laenge 0 kuerzen *)
  195.     oEXCL,      (* Neu Anlegen nicht erlaubt, falls schon vorhanden *)
  196.     oNOCTTY,    (* Falls die zu oeffnende Datei ein (Pseudo)Terminal ist,
  197.                    wird es nicht zum Kontroll-Terminal, wenn der Prozess
  198.                    im Moment kein Kontrollterminal hat. *)
  199.     Open13, Open14, Open15
  200.   );
  201. #endif
  202.  
  203.   OpenMode = PACKEDSET OF OpenModes;
  204.  
  205. CONST
  206.   oACCMODE = OpenMode{rw0, rw1}; (* Maske fuer erlaubte Operationen *)
  207.  
  208.   oRDONLY  = OpenMode{ };   (* 0000H, nur Lesen erlaubt *)
  209.   oWRONLY  = OpenMode{rw0}; (* 0001H, nur Schreiben erlaubt *)
  210.   oRDWR    = OpenMode{rw1}; (* 0002H, Lesen und Schreiben erlaubt *)
  211.  
  212. (*======================= "lseek()" =========================================*)
  213.  
  214. TYPE
  215.   SeekMode = (
  216.     SeekSet, (* = 0, absolute Positionsangabe *)
  217.     SeekCur, (* = 1, Positionsangabe relativ zur augenblicklichen Position *)
  218.     SeekEnd  (* = 2, Positionsangabe relativ zum Dateiende *)
  219.   );
  220.  
  221. (*======================== "fcntl()" ========================================*)
  222.  
  223. TYPE
  224. #if reverse_set
  225.   FDFlags = (
  226.     FD15, FD14, FD13, FD12, FD11, FD10, FD9,
  227.     FD8,  FD7,  FD6,  FD5,  FD4,  FD3,  FD2, FD1,
  228.     FdCloExec  (* bei "exec*()" Dateikennung schliessen *)
  229.   );
  230. #else
  231.   FDFlags = (
  232.     FdCloExec, (* bei "exec*()" Dateikennung schliessen *)
  233.     FD1,  FD2,  FD3,  FD4,  FD5,  FD6,  FD7, FD8,
  234.     FD9,  FD10, FD11, FD12, FD13, FD14, FD15
  235.   );
  236. #endif
  237.   FDFlag = PACKEDSET OF FDFlags;
  238.  
  239. TYPE
  240.   FcntlCmd = (
  241.     fDUPFD, (* neue Dateikennung liefern (-> "dup()") *)
  242.     fGETFD, (* Flags der Dateikennung ermitteln (-> FDFlags) *)
  243.     fSETFD, (* Flags der Dateikennung setzen (-> FDFlags ) *)
  244.     fGETFL, (* Flags des Dateibeschreibungsblocks liefern *)
  245.     fSETFL, (* Flags des Beschreibungsblocks setzen,ausser Lese/Schreibmodus *)
  246.     fGETLK, (* Informationen ueber einen ``Lock'' liefern *)
  247.     fSETLK, (* ``Lock'' setzen, sofort zurueck, falls nicht moeglich *)
  248.     fSETLKW (* ``Lock'' setzen, blockieren, bis moeglich *)
  249.   );
  250.  
  251. TYPE
  252.   LockType = (
  253.     fRDLCK, (* (set) read/shared lock *)
  254.     fWRLCK, (* (set) write/exclusive lock *)
  255.     fUNLCK  (* unlock/unlocked *)
  256.   );
  257.  
  258. TYPE
  259.   FlockRec = RECORD
  260.     lType   : LockType; (* Typ des ``Locks'' *)
  261.     lWhence : SeekMode; (* Offset, von dem 'lStart' gerechnet wird *)
  262.     lStart  : offT;     (* Start des ``Locks'' *)
  263.     lLen    : offT;     (* Groesse des ``Locks'' (0 = bis zum Dateiende) *)
  264.     lPid    : pidT;     (* Prozess-Kennung des ``Lock-Besitzers'' *)
  265.   END;
  266.  
  267. TYPE
  268.   FcntlArg = RECORD
  269.     CASE TAG_COLON FcntlCmd OF
  270.       fDUPFD  : handle  : INTEGER;  (* in & out *)
  271.      |fGETFD,                       (* out *)
  272.       fSETFD  : fdflags : FDFlag;   (* in *)
  273.      |fGETFL,                       (* out *)
  274.       fSETFL  : mode    : OpenMode; (* in *)
  275.      |fGETLK,                       (* in & out *)
  276.       fSETLK,                       (* in & out *)
  277.       fSETLKW : flock   : FlockRec; (* in & out *)
  278.     END;
  279.   END;
  280.  
  281. (*======================= "pipe()" ==========================================*)
  282.  
  283. TYPE
  284.   PipeBuf = RECORD
  285.     readh  : INTEGER;
  286.     writeh : INTEGER;
  287.   END;
  288.  
  289. (*===================== "open()", "creat()" =================================*)
  290.  
  291. CONST (* kleinstes gueltiges Handle, nicht POSIX: *)
  292. #ifdef __GEMDOS__
  293.   MINHANDLE = -5; (* wegen MIDI-in/out *)
  294. #else
  295.   MINHANDLE = 0;
  296. #endif
  297.  
  298. (*===========================================================================*)
  299.  
  300. CONST (* Die immer geoeffneten Standardkanaele *)
  301.   StdinFileNo  = 0;
  302.   StdoutFileNo = 1;
  303.   StderrFileNo = 2; (* "GEMDOS": Durch 'DosSupport' sichergestellt *)
  304.  
  305. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  306.  
  307.  PROCEDURE creat ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  308.                   (* EIN/ -- *)     mode : modeT         ): INTEGER;
  309.  
  310.  PROCEDURE open ((* EIN/ -- *) REF file   : ARRAY OF CHAR;
  311.                  (* EIN/ -- *)     access : OpenMode;
  312.                  (* EIN/ -- *)     mode   : modeT         ): INTEGER;
  313.  
  314. (*--------------------------------------------------------------------------
  315.  | "open()" oeffnet eine bereits vorhandene Datei namens <file> in dem durch|
  316.  | <access> festgelegten Modus (Funktionalitaet siehe Def. von 'OpenModes'),|
  317.  | bzw. erzeugt eine neue mit den Attributen aus <mode>, falls in <access>  |
  318.  | 'oCREAT' gesetzt ist. Die Datei ist ueber die als Funktionswert zurueck- |
  319.  | gelieferte Kennung referenzierbar. Es wird die kleinste Kennung gelie-   |
  320.  | fert, die frei ist.                                                      |
  321.  | "creat()" entspricht: "open(file,oWRONLY+OpenMode{oCREAT,oTRUNC},mode)"  |
  322.  |                                                                          |
  323.  | Oeffnen einer Datei bedeutet folgendes: Es wird ein Dateibeschreibungs-  |
  324.  | block fuer die Datei <file> angelegt, und eine Kennung geliefert, ueber  |
  325.  | die dieser Block angesprochen werden kann. Die gleiche Datei kann mehr-  |
  326.  | fach geoeffnet sein und damit mehrere Dateibeschreibungsbloecke besitzen.|
  327.  | Jeder Beschreibungsblock kann wiederum mehrere Dateikennungen erhalten.  |
  328.  | Die Statusflags und der Zugriffsmodus aus <access> sind Attribute des    |
  329.  | Beschreibungsblocks, ebenso wie die Position des Lese/Schreibzeigers. Die|
  330.  | Statusflags koennen mit "fcntl(fGETFL/fSETFL)" abgefragt und veraendert  |
  331.  | (ausser dem Zugriffsmodus) werden, der Lese/Schreibzeiger wird durch     |
  332.  | "read()", "write()" und "lseek()" veraendert. Eine neue Kennung fuer     |
  333.  | denselben Beschreibungsblock kann mit "dup()" oder "fcntl(fDUPFD)"       |
  334.  | erzeugt werden. Mit "dup2()" laesst sich eine Dateikennung auf einen     |
  335.  | anderen Beschreibungsblock umleiten.                                     |
  336.  | Mit "fcntl(fGETFD/fSETFD)" laesst sich das ``Schliessen bei exec''-Flag  |
  337.  | abfragen und setzen, das ein Attribut der Dateikennung ist; dieses Flag  |
  338.  | ist nach dem Oeffnen einer Datei geloescht. Nur falls eine neue Datei    |
  339.  | angelegt wird, wird <mode> verwendet, das ein Attribut der Datei ist.    |
  340.  |                                                                          |
  341.  | GEMDOS: <access>: oNOCTTY und oNONBLOCK und oAPPEND werden ignoriert.    |
  342.  |         <mode>: Die Datei kann lediglich schreibgeschuetzt werden.       |
  343.  |         Die kleinste Kennung fuer eine normale Datei ist 6.              |
  344.  |         Eine Datei kann nur zum Lesen mehrfach geoeffnet werden.         |
  345.  |   MiNT: oNOCTTY und oAPPEND werden unterstuetzt, fuer oNONBLOCK wird     |
  346.  |         oNDELAY verwendet. Die Unterstuetzung von <mode> haengt vom      |
  347.  |         Dateisystem ab.                                                  |
  348.  |                                                                          |
  349.  | Es koennen auch Geraete geoeffnet werden, sodass auch negative Werte     |
  350.  | auftreten koennen. Ein Fehler ist erst aufgetreten, falls der Funktions- |
  351.  | wert 'MINHANDLE' unterschreitet.                                         |
  352.   --------------------------------------------------------------------------*)
  353.  
  354.  
  355.  PROCEDURE fcntl ((* EIN/ -- *)     h   : INTEGER;
  356.                   (* EIN/ -- *)     cmd : FcntlCmd;
  357.                   (* EIN/AUS *) VAR arg : FcntlArg ): INTEGER;
  358.  
  359. (*--------------------------------------------------------------------------
  360.  | Fuehrt je nach <cmd> eine Funktion auf der ueber <h> erreichbaren Datei  |
  361.  | aus. Argumente und Ergebnisse werden ueber <arg> mitgeteilt:             |
  362.  |                                                                          |
  363.  |  cmd = fDUPFD : zweite Dateikennung zu <h> liefern ( -> "dup()").        |
  364.  |    arg.handle:                                                           |
  365.  |      Eingabe: kleinster Wert fuer neue Kennung                           |
  366.  |      Ausgabe: neue Kennung                                               |
  367.  |                                                                          |
  368.  |  cmd = fGETFD : Flags der Dateikennung ermitteln (Dateikennung schliessen|
  369.  |                 bei Ausfuehren von ``exec'').                            |
  370.  |    arg.fdflags:                                                          |
  371.  |      Eingabe: --------                                                   |
  372.  |      Ausgabe: Flags                                                      |
  373.  |                                                                          |
  374.  |  cmd = fSETFD : Flags der Dateikennung setzen.                           |
  375.  |    arg.fdflags:                                                          |
  376.  |      Eingabe: Flags                                                      |
  377.  |      Ausgabe: --------                                                   |
  378.  |                                                                          |
  379.  |  cmd = fGETFL : Flags des Dateibeschreibungsblocks liefern.              |
  380.  |    arg.mode:                                                             |
  381.  |      Eingabe: --------                                                   |
  382.  |      Ausgabe: Modus-Flags                                                |
  383.  |                                                                          |
  384.  |  cmd = fSETFL : Flags des Dateibeschreibungsblocks setzen, bis auf den   |
  385.  |                 Lese/Schreibmodus, der nicht veraendert werden kann.     |
  386.  |    arg.mode:                                                             |
  387.  |      Eingabe: Modus-Flags                                                |
  388.  |      Ausgabe: --------                                                   |
  389.  |                                                                          |
  390.  |  cmd = fGETLK : Liefert Informationen, ob ein bestimmter Bereich der     |
  391.  |                 Datei fuer konkurrierenden Zugriff gesperrt ist.         |
  392.  |    arg.flock:                                                            |
  393.  |      Eingabe: Typ, Position und Laenge des in Frage kommenden ``Locks''. |
  394.  |      Ausgabe: Typ, Position und Laenge eines ``Locks'', der sich         |
  395.  |               (teilweise) mit dem angegeben Bereich ueberschneidet, oder |
  396.  |               Information, dass der Bereich frei ist ('lType' = fUNLCK). |
  397.  |                                                                          |
  398.  |  cmd = fSETLK                                                            |
  399.  |    arg.flock:                                                            |
  400.  |      Eingabe:                                                            |
  401.  |      Ausgabe:                                                            |
  402.  |                                                                          |
  403.  |  cmd = fSETLKW : wie 'fSETLK', aber warten, bis ``Lock'' gesetzt werden  |
  404.  |                  kann.                                                   |
  405.  |                                                                          |
  406.  |                                                                          |
  407.  | GEMDOS: Bisher wird nur 'fDUPFD' unterstuetzt. Falls der GEMDOS-Aufruf   |
  408.  |         "Flock()" existiert, wird auch 'fSETLK' (teilweise) unterstützt. |
  409.  |   MiNT: Die Unterstuetzung von ``Locks'' haengt vom Dateisystem ab.      |
  410.  |         Bei 'fGETFL'/'fSETFL' wird fuer 'oNONBLOCK' 'oNDELAY' verwendet. |
  411.   --------------------------------------------------------------------------*)
  412.  
  413.  
  414.  
  415.  
  416.  PROCEDURE close ((* EIN/ -- *) h : INTEGER ): INTEGER;
  417.  
  418. (*--------------------------------------------------------------------------
  419.  | Die Datei mit der Kennung <h> wird geschlossen. Danach kann nicht mehr   |
  420.  | ueber <h> auf die Datei zugegriffen werden. Die Kennung <h> ist jetzt    |
  421.  | ``frei'', sodass sie wieder mit einer anderen Datei verbunden werden     |
  422.  | kann.                                                                    |
  423.  |                                                                          |
  424.  | GEMDOS: Keine Besonderheiten.                                            |
  425.  |   MiNT: -""-                                                             |
  426.   --------------------------------------------------------------------------*)
  427.  
  428.  
  429.  
  430.  PROCEDURE read ((* EIN/ -- *) h   : INTEGER;
  431.                  (* EIN/ -- *) buf : ADDRESS;
  432.                  (* EIN/ -- *) len : sizeT   ): ssizeT;
  433.  
  434.  PROCEDURE write ((* EIN/ -- *) h   : INTEGER;
  435.                   (* EIN/ -- *) buf : ADDRESS;
  436.                   (* EIN/ -- *) len : sizeT   ): ssizeT;
  437.  
  438. (*--------------------------------------------------------------------------
  439.  | "read()" liest <len> Bytes aus der Datei mit der Kennung <h> in den Puf- |
  440.  | fer ab der Adresse <buf>. Als Funktionswert wird die Anzahl der gelesenen|
  441.  | Bytes zurueckgeliefert (0 = Dateiende, -1 = Fehler).                     |
  442.  | "write()" schreibt <len> Bytes aus dem Puffer mit der Startadresse <buf> |
  443.  | in die Datei mit der Kennung <h>. Als Funktionswert wird die Anzahl der  |
  444.  | geschriebenen Bytes zurueckgeliefert (<> len = Fehler).                  |
  445.  | Aus Portabilitaetsgruenden ('ssizeT' = 16 Bit ist moeglich) sollte <len> |
  446.  | nicht groesser als 32767 sein.                                           |
  447.  |                                                                          |
  448.  | GEMDOS: Das Lesen/Schreiben von/auf Terminals kann nicht beeinflusst     |
  449.  |         werden (Interpretation von ^C u.ae.).                            |
  450.  |   MiNT: Keine Besonderheiten.                                            |
  451.   --------------------------------------------------------------------------*)
  452.  
  453.  
  454.  PROCEDURE lseek ((* EIN/ -- *) h    : INTEGER;
  455.                   (* EIN/ -- *) off  : offT;
  456.                   (* EIN/ -- *) mode : SeekMode ): offT;
  457.  
  458. (*--------------------------------------------------------------------------
  459.  | Die aktuelle Lese/Schreibposition der Datei mit der Kennung <h> wird, je |
  460.  | nach <mode>, Beschreibung siehe dort, um <off> Bytes verschoben, bzw.    |
  461.  | auf Position <off> gesetzt. Hierbei kann auch ueber das Ende der Datei   |
  462.  | positioniert werden, die Datei wird aber erst dann (virtuell) verlaengert|
  463.  | (-> ``gap'') wenn ein Schreibvorgang hinter dem tatsaechlichen bisherigen|
  464.  | Dateiende stattfindet.                                                   |
  465.  | Als Funktionswert wird die aktuelle Schreib/Leseposition geliefert.      |
  466.  |                                                                          |
  467.  | GEMDOS: Es ist kein Verlaengern der Datei durch ein "Fseek" hinter das   |
  468.  |         augenblickliche Dateiende moeglich, daher wird bei "lseek" das   |
  469.  |         Verlaengern durch blockweises (jeweils 1kB) Schreiben mit Null-  |
  470.  |         bytes realisiert; das kann natuerlich je nach Umfang der Erwei-  |
  471.  |         terung ein bisschen dauern.                                      |
  472.  |   MiNT: Unterstuetzung der Dateiverlaengerung haengt vom Dateisystem ab. |
  473.   --------------------------------------------------------------------------*)
  474.  
  475.  
  476. (* noch nicht POSIX: *)
  477.  PROCEDURE ftruncate ((* EIN/ -- *) h   : INTEGER;
  478.                       (* EIN/ -- *) len : offT    ): INTEGER;
  479.  
  480. (*--------------------------------------------------------------------------
  481.  | Wenn <h> eine geoffnete regulaere Datei kennzeichnet, die groesser als   |
  482.  | <len> Bytes ist, wird die Datei auf <len> Bytes gekuerzt. Wenn die Datei |
  483.  | kuerzer als <len> ist, ist das Verhalten systemspezifisch.               |
  484.  |                                                                          |
  485.  | GEMDOS: Liefert immer -1 (errno = 'ENOSYS').                             |
  486.  |   MiNT: Unterstuetzung haengt vom Dateisystem ab.                        |
  487.   --------------------------------------------------------------------------*)
  488.  
  489.  
  490.  
  491.  PROCEDURE dup ((* EIN/ -- *) h : INTEGER ): INTEGER;
  492.  
  493.  PROCEDURE dup2 ((* EIN/ -- *) oldh : INTEGER;
  494.                  (* EIN/ -- *) newh : INTEGER ): INTEGER;
  495.  
  496. (*--------------------------------------------------------------------------
  497.  | "dup()" liefert zur Dateikennung <h> eine zweite Kennung (die kleinste   |
  498.  | freie Kennung), sodass die entsprechende Datei ueber beide Kennungen an- |
  499.  | gesprochen werden kann. Das 'FdCloExec'-Flag der Dateikennung ist ge-    |
  500.  | loescht.                                                                 |
  501.  | Bei "dup2()" kann die kleinstmoegliche neue Kennung (<newh>) vorgegeben  |
  502.  | werden; Als Funktionswert wird die kleinste freie Kennung geliefert, die |
  503.  | nicht kleiner als <newh> ist.                                            |
  504.  |                                                                          |
  505.  | GEMDOS: Hier funktionieren die Umlenkungen erst ab TOS 1.04 einiger-     |
  506.  |         massen, aber auch nicht voellig korrekt (z.B. keine mehrfache    |
  507.  |         Umlenkung, kein Pexec nach "dup()").                             |
  508.  |         "dup()" : <h> muss die Nummer eines Standardkanals sein, also    |
  509.  |         0 <= h <= 5. Die kleinstmoegliche neue Kennung ist 6.            |
  510.  |         "dup2()": <newh> muss die Nummer eines Standardkanals sein, also |
  511.  |         0 <= <newh> <= 5; weiterhin muss <oldh> ein Nicht-Standard-Handle|
  512.  |         (normales Datei- oder Geraetehandle) sein.                       |
  513.  |   MiNT: Keine Besonderheiten.                                            |
  514.   --------------------------------------------------------------------------*)
  515.  
  516.  
  517.  
  518.  PROCEDURE umask ((* EIN/ -- *) excl : modeT ): modeT;
  519.  
  520. (*--------------------------------------------------------------------------
  521.  | Setzt die Dateierstellungsmaske, die als Filter fuer die Zugriffsberech- |
  522.  | tigung benutzt wird, wenn eine Datei mit "open()" oder "creat()" neu     |
  523.  | erstellt, oder ein Verzeichnis mit "mkdir()" angelegt wird: Von der ange-|
  524.  | gebenen Zugriffsberechtigung wird immer zuerst die Maske subtrahiert,    |
  525.  | sodass Dateien z.B. grundsaetzlich fuer Gruppe und andere schreibge-     |
  526.  | schuetzt werden koennen.                                                 |
  527.  | Als Funktionswert wird die alte Maske zurueckgeliefert.                  |
  528.  |                                                                          |
  529.  | GEMDOS: Keine Besonderheiten, aber nicht sonderlich sinnvoll.            |
  530.  |   MiNT: Keine Besonderheiten.                                            |
  531.   --------------------------------------------------------------------------*)
  532.  
  533.  
  534.  PROCEDURE chmod ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  535.                   (* EIN/ -- *)     mode : modeT         ): INTEGER;
  536.  
  537. (*--------------------------------------------------------------------------
  538.  | Setzt die Schreib-, Lese- und Ausfuehrungsrechte und die ``set user id'' |
  539.  | und ``set group id'' Flags der Datei <file>.                             |
  540.  |                                                                          |
  541.  | GEMDOS: Es wird nur sIWUSR ausgewertet: wenn das Bit gesetzt ist, wird   |
  542.  |         'faRDONLY' im Dateiattribut geloescht und umgekehrt.             |
  543.  |         Das Dateiattribut 'faCHANGED' wird nicht geaendert. Attribute    |
  544.  |         von Verzeichnissen koennen nicht geaendert werden (ist aber kein |
  545.  |         Fehler).                                                         |
  546.  |   MiNT: Unterstuetzung haengt vom Dateisystem ab.                        |
  547.   --------------------------------------------------------------------------*)
  548.  
  549.  
  550.  PROCEDURE chown ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  551.                   (* EIN/ -- *)     uid  : uidT;
  552.                   (* EIN/ -- *)     gid  : gidT          ): INTEGER;
  553.  
  554. (*--------------------------------------------------------------------------
  555.  | Setzt die Besitzer- und Gruppenkennung der Datei <file>.                 |
  556.  |                                                                          |
  557.  | GEMDOS: Falls <uid> und <gid> ungleich Null sind, wird -1 geliefert      |
  558.  |         (errno = 'EINVAL').                                              |
  559.  |   MiNT: Unterstuetzung haengt vom Dateisystem ab.                        |
  560.   --------------------------------------------------------------------------*)
  561.  
  562.  
  563.  PROCEDURE utime ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  564.                   (* EIN/ -- *)     time : UTimeBuf      ): INTEGER;
  565.  
  566. (*--------------------------------------------------------------------------
  567.  | Setzt die Zeit des letzten Dateizugriffs (st.stAtime) der Datei <file>   |
  568.  | auf <time.actime> und die Zeit der letzten Dateiveraenderung (st.stMtime)|
  569.  | auf <time.modtime>. Die Zeit der letzten Statusaenderung (st.stCtime)    |
  570.  | wird automatisch auf das aktuelle Datum gesetzt. Wird fuer 'modtime' eine|
  571.  | Null uebergeben, wird das aktuelle Datum eingesetzt.                     |
  572.  |                                                                          |
  573.  | GEMDOS: Zeit und Datum sind im DOS-Format, siehe 'types.timeT'. Es wird  |
  574.  |         nur <time.modtime> ausgewertet.                                  |
  575.  |   MiNT: Bei geeignetem Dateisystem werden 'modtime' und 'actime' ausge-  |
  576.  |         wertet.                                                          |
  577.   --------------------------------------------------------------------------*)
  578.  
  579.  
  580.  PROCEDURE stat ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  581.                  (* -- /AUS *) VAR st   : StatRec       ): INTEGER;
  582.  
  583.  PROCEDURE fstat ((* EIN/ -- *)     hndl : INTEGER;
  584.                   (* -- /AUS *) VAR st   : StatRec  ): INTEGER;
  585.  
  586. (* noch nicht POSIX: *)
  587.  PROCEDURE lstat ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  588.                   (* -- /AUS *) VAR st   : StatRec       ): INTEGER;
  589.  
  590. (*--------------------------------------------------------------------------
  591.  | Die Prozeduren liefern zum Namen <file> einer Datei bzw. einer Datei-    |
  592.  | kennung <hndl> die Informationen aus dem INODE (siehe Def. von 'modeT'   |
  593.  | und 'StatRec'.                                                           |
  594.  | Bei einem 'Symbolischen Link' liefert "stat()" Informationen ueber die   |
  595.  | physikalisch referenzierte Datei, "lstat()" Informationen ueber den Link |
  596.  | selber, ansonsten sind die beiden Funktionen identisch.                  |
  597.  |                                                                          |
  598.  | GEMDOS:                                                                  |
  599.  |          o 'stMode': Die Berechtigungen fuer Besitzer, Gruppe und Andere |
  600.  |            sind identisch; Leseberechtigung ist immer gegeben, Schreib-  |
  601.  |            berechtigung ist vorhanden, falls 'faRDONLY' im Dateiattribut |
  602.  |            nicht gesetzt ist, die Ausfuehrberechtigung bei regulaeren    |
  603.  |            Dateien wird mit 'DosSupport.IsExec' festgestellt, Verzeich-  |
  604.  |            nisse haben immer Suchberechtigung. Geraete werden mit        |
  605.  |            'DosSupport.IsDosDevice' ermittelt, Verzeichnisse durch ein   |
  606.  |            gesetztes 'faSUBDIR' im Dateiattribut, alles andere sind      |
  607.  |            regulaere Dateien.                                            |
  608.  |          o 'stIno': ein fortlaufender Wert, der keine Beziehung zur Datei|
  609.  |            hat.                                                          |
  610.  |          o 'stDev': die (aktuelle) Laufwerksnummer (A = 0, B = 1...).    |
  611.  |          o 'stNlink': bei Verzeichnissen zwei (wegen ".."), sonst eins.  |
  612.  |          o 'stSize': bei Verzeichnissen konstant 1024.                   |
  613.  |          o 'stAtime', 'stMtime', 'stCtime': die Zeiten sind identisch    |
  614.  |            und im kodierten DOS-Format, aber das Datum ist im hoeherwer- |
  615.  |            tigen Wort, sodass durch einen direkten Vergleich des gesamten|
  616.  |            Langwortes die zeitliche Reihenfolge korrekt ermittelt wird.  |
  617.  |            Bei Geraeten werden aktuelle Zeit und aktuelles Datum genommen|
  618.  |            Bei Wurzelverzeichnissen ist der Wert Null.                   |
  619.  |                                                                          |
  620.  |          "lstat()": ohne MiNT ist diese Funktion mit "stat()" identisch. |
  621.  |          Diese Funktion ist noch nicht POSIX-Standard.                   |
  622.  |                                                                          |
  623.  |          "fstat()": ohne MiNT sind die einzigen zuverlaessigen Informa-  |
  624.  |          tionen 'stSize' und 'stMtime', falls <hndl> eine gueltige Ken-  |
  625.  |          nung einer regulaeren Datei ist.                                |
  626.  |                                                                          |
  627.  |   MiNT: Unterstuetzung haengt vom Dateisystem ab.                        |
  628.  |         Bei symbolischen Links zaehlt MiNT das abschliessende Nullbyte   |
  629.  |         des Pfadnamens mit, sodass 'stSize' ein Byte laenger als der     |
  630.  |         Pfadname ist. Zumindest unter SunOS wird das Nullbyte aber nicht |
  631.  |         mitgezaehlt.                                                     |
  632.   --------------------------------------------------------------------------*)
  633.  
  634.  PROCEDURE sISCHR  ((* EIN/ -- *) stMode : modeT ): BOOLEAN;
  635.  PROCEDURE sISDIR  ((* EIN/ -- *) stMode : modeT ): BOOLEAN;
  636.  PROCEDURE sISBLK  ((* EIN/ -- *) stMode : modeT ): BOOLEAN;
  637.  PROCEDURE sISREG  ((* EIN/ -- *) stMode : modeT ): BOOLEAN;
  638.  PROCEDURE sISFIFO ((* EIN/ -- *) stMode : modeT ): BOOLEAN;
  639.  (* noch nicht POSIX: *)
  640.  PROCEDURE sISLNK  ((* EIN/ -- *) stMode : modeT ): BOOLEAN;
  641.  
  642. (*--------------------------------------------------------------------------
  643.  | Diese Funktionen sind bei POSIX als Makros definiert, und liefern TRUE,  |
  644.  | falls der im 'stMode'-Feld der StatRec-Struktur kodierte Dateityp dem    |
  645.  | durch den Prozedurnamen angedeuteten entspricht.                         |
  646.  | Es sollten nur diese Prozeduren verwendet werden, um den Dateityp zu     |
  647.  | bestimmen.                                                               |
  648.  |                                                                          |
  649.  | GEMDOS: Keine Besonderheiten.                                            |
  650.  |   MiNT: -""-                                                             |
  651.   --------------------------------------------------------------------------*)
  652.  
  653.  
  654.  
  655.  PROCEDURE access ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  656.                    (* EIN/ -- *)     acc  : AccessMode    ): INTEGER;
  657.  
  658. (*--------------------------------------------------------------------------
  659.  | Es wird die Existenz (<acc> = fOK) oder die Lese-, Schreib oder Ausfuehr-|
  660.  | bzw. Suchberechtigung einer Datei getestet. Beim Test wird beruecksich-  |
  661.  | tigt, ob der ausfuehrende Prozess der Besitzer der Datei ist, der Gruppe |
  662.  | des Besitzers angehoert oder ein Aussenstehender ist (Es werden die      |
  663.  | realen Kennungen getestet). Es ist nicht festgelegt, ob der ``Superuser''|
  664.  | besondere Rechte hat, d.h. alle Zugriffsrechte besitzt.                  |
  665.  |                                                                          |
  666.  | GEMDOS: Die bei "stat()" genannten Einschraenkungen gelten.              |
  667.  |   MiNT: -""-                                                             |
  668.   --------------------------------------------------------------------------*)
  669.  
  670.  
  671.  PROCEDURE pipe ((* -- /AUS *) VAR ph : PipeBuf ): INTEGER;
  672.  
  673. (*--------------------------------------------------------------------------
  674.  | Generiert einen Kommunikationskanal zwischen zwei (Unter)Prozessen. Der  |
  675.  | eine Prozess kann ueber <ph.writeh> etwas schreiben, das der andere      |
  676.  | ueber <ph.readh> lesen kann. Die Groesse einer ``Pipe'' ist intern be-   |
  677.  | grenzt (z.B. auf 2kB oder 4kB), sodass der schreibende Prozess zeitweise |
  678.  | gestoppt werden kann, bis wieder etwas Platz in der Pipe vorhanden ist.  |
  679.  |                                                                          |
  680.  | GEMDOS: Liefert immer -1 (errno = 'ENOSYS').                             |
  681.  |   MiNT: Keine Besonderheiten.                                            |
  682.   --------------------------------------------------------------------------*)
  683.  
  684. END file.
  685.